"""
多态:
     指的是同一操作(函数)作用于不同的对象，可以有不同的解释，产生不同的执行结果。
     大白话： 多态指的是同一个事物在不同环境下表现出不来的不同状态

     Python中： 同一个函数，接收不同的对象，达到不一样的效果
     实现条件：
        1. 要有继承关系
        2. 要实现方法的重写
        3. 要有父类的引用指向子类的对象
"""

class Animal:
    def __init__(self,name):
        self.name = name

    def speak(self): # 没有方法体的方法就是抽象方法
        pass

class Dog(Animal):

    def speak(self):
        print(f'我是狗{self.name}，我汪汪汪的叫')


class Cat(Animal):

    def speak(self):
        print(f'我是猫{self.name}，我喵喵喵的叫')

class Pig(Animal):
    def speak(self):
        print(f'我是猪{self.name}，我呼呼呼的叫')


# 这是一个方法
def animal_Speak(a:Animal): # 指定传入的参数a必须是Animal类型
    print(type(a))
    a.speak()





if __name__ == '__main__':

    d1 = Dog('旺财')
    d2 = Dog('大黄')
    d3 = Dog('小黑')

    c1 = Cat('招财')
    c2 = Cat('叮当')
    c3 = Cat('咖啡')

    p1 = Pig('佩奇')
    p2 = Pig('乔治')
    p3 = Pig('喜猪猪')


    # animal_Speak(d1)
    # animal_Speak(d2)
    # animal_Speak(c3)
    # animal_Speak(p2)

    animals = [d1,d2,d3,c1,c2,c3,p1,p2,p3]

    for animal in animals:
        animal_Speak(animal)

